php curl文件流

您所在的位置:网站首页 PHPcurl返回二进制流 无法识别 php curl文件流

php curl文件流

2024-07-16 16:55| 来源: 网络整理| 查看: 265

php curl文件流 应用场景:

很多时候我们接第三方接口时遇到参数需要传文件流格式的字段,不能直接传图片链接的情况。又不能直接请求第三方接口,只能采取从客户端先请求我方接口,再通过我方服务器请求第三方接口的情况,需要我方把接收到的文件流原封不动上送给第三方。首先这个原封不动就很难,因为从客户端过来我们接收到的文件就已经是个文件数组了,而且后端无法获取客户端上传文件的本地路径,因为浏览器为了安全起见已经屏蔽了上送方的文件路径。 在这里插入图片描述 而且通过file方式上传的,通过post接收是接收不到的,php需要通过函数$_FILES才能接收到,下面是已经上传了两个参数,但post打印只有code参数。 在这里插入图片描述 而文件类型上传怎么能够获取到客户端完整的文件呢 在这里插入图片描述 其实这个tmp_name就是存放这个文件的临时路径,但是无法通过临时路径文件直接curl至第三方接口(其他服务器)。文件传输的思路就是客户端->我方服务器->第三方服务器;这里面有个注意的点是,不能通过临时文件直接上送至第三方服务器。 PHP上传文件类型的方法有在文件字段的参数值前加上"@"符号,会将它识别为文件流类型,但是我并没有生效,我用的是另外一种用CURLFile类。请求header的设置很多帖子说设置成content-type:multipart/form-data;但是我试了content-type:text/html;也是没问题的。如下代码:

public function uploadPictureAction() { $post = $this->req->getPost(); // header('content-type:multipart/form-data;charset=utf8'); header('content-type:text/html;charset=utf8'); $ch = curl_init(); //加@符号curl就会把它当成是文件上传处理 $data = [ 'code' => 111, 'file' => new CURLFile('/mnt/d/www/saas_api/web/upload/picture/1665994115.png'),//这里是固定服务器的文件路径,可以变更成接收的文件路径 // 'file' => '@'.'/mnt/d/www/saas_api/web/upload/picture/1665994115.png' ]; curl_setopt($ch, CURLOPT_URL, "http://127.0.0.1:8086/signagreement/uploadSign"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $result = curl_exec($ch); curl_close($ch); $this->jsonify([]); }

以下是我的接收方法:

public function uploadResultAction() { $raw = $this->req->getPost(); echo 'post2:'.json_encode($raw,JSON_UNESCAPED_UNICODE); echo 'file2:'.json_encode($_FILES,JSON_UNESCAPED_UNICODE); }

打印出来是这样的 在这里插入图片描述 完整示例是这样的:

public function registerCompanyAction() { if(isset($_FILES['file']) && !$_FILES['file']['error']) { // 文件存在且不报错 $fileName = $_FILES['file']['name']; // 获取文件 $fileExtension = pathinfo($fileName); // 获取文件路径信息 $fileExtension = $fileExtension['extension']; // 获取文件后缀 $time = time(); // 根据时间戳区分 $destinationPath = $_SERVER['DOCUMENT_ROOT'].'/upload/picture/';// 目标文件夹 $newFileName = $destinationPath . $time . "." . $fileExtension; // 完整的url if(move_uploaded_file($_FILES['file']['tmp_name'], $newFileName)) { // 移动文件到目标路径 echo("文件移动成功"); } else { die("文件路径出错"); } } // header('content-type:multipart/form-data;charset=utf8'); header('content-type:text/html;charset=utf8'); $ch = curl_init(); //加@符号curl就会把它当成是文件上传处理 $data = [ 'code' => 111, 'file' => new CURLFile($newFileName), // 'file' => '@'.$newFileName ]; curl_setopt($ch, CURLOPT_URL, "http://127.0.0.1:8086/signagreement/uploadSign"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $result = curl_exec($ch); curl_close($ch); return $result; } ```


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3